home *** CD-ROM | disk | FTP | other *** search
/ Just Call Me Internet / Just Call Me Internet.iso / prog / atari / c / du_lib / ipopup.c < prev    next >
C/C++ Source or Header  |  1995-07-10  |  5KB  |  213 lines

  1. /*
  2.   DU_LIB v2
  3.   Gem Window Management & Dialog Library For Lattice C
  4.   ½1994, by Craig Graham.
  5.   
  6.   Based on the DU_LIBv1 Library for HiSoft Basic.
  7. */
  8.  
  9. /*
  10.     Icon Popup Handler
  11. */
  12.  
  13. #include "DULIB.H"
  14.  
  15. void Set_icon_popup(short dialog, short object, short p_form)
  16. {
  17.     Elist *n;
  18.     n=(Elist*)0;
  19.  
  20.     Set_object_redraw(dialog,object,&display_p_icon);                /*customise the redraw*/
  21.     Set_object_dcallback(dialog,object,&do_icon_popup);                /*double click pops up the menu*/
  22.  
  23.     find_event(dialog,object,&n);
  24.     n->popup_form=p_form;
  25.     n->popup_icon_current=1;
  26.  
  27. }
  28.  
  29. short Get_icon_popup(short dialog, short object)
  30. {
  31.     Elist *n;
  32.  
  33.     n=(Elist*)0;
  34.     find_event(dialog,object,&n);
  35.     if (n)
  36.     {
  37.         return n->popup_icon_current;
  38.     } else {
  39.         return 0;
  40.     }
  41.  
  42. }
  43.  
  44. short display_p_icon(void)
  45. {
  46.     OBJECT *a;
  47.     OBJECT *parent;
  48.     Elist *n;
  49.     
  50.     n=(Elist*)0;
  51.  
  52.     find_event(this_dialog,this_ob,&n);
  53.     
  54.     rsrc_gaddr(0,n->popup_form,&a);                /*find icon popup form*/
  55.     rsrc_gaddr(0,this_dialog,&parent);            /*find dialog containing hot icon*/
  56.     objc_draw(parent,this_ob,1,cr_dclip.g_x,cr_dclip.g_y,cr_dclip.g_w,cr_dclip.g_h);
  57.     parent=parent+this_ob;
  58.     
  59.     (a+(n->popup_icon_current))->ob_x=0;        /*current icon to origin in dial*/
  60.     (a+(n->popup_icon_current))->ob_y=0;
  61.     a->ob_x=cr_clip.g_x;                        /*form to required redraw location*/
  62.     a->ob_y=cr_clip.g_y;
  63.     (a+(n->popup_icon_current))->ob_state=parent->ob_state;
  64.     
  65.     objc_draw(a,n->popup_icon_current,1,cr_dclip.g_x,cr_dclip.g_y,cr_dclip.g_w,cr_dclip.g_h);
  66.  
  67.     return 0;
  68. }
  69.  
  70. short do_icon_popup(void)
  71. {    
  72.     OBJECT *a;
  73.     OBJECT *s;
  74.     short maxh,px,m;
  75.     Elist *n;
  76.     MFDB scr,obm;
  77.     short p[8];
  78.     short *buf;
  79.     short e,c,rtn,mx,my,mb;
  80.     
  81.     n=(Elist*)0;
  82.  
  83.     find_event(this_dialog,this_ob,&n);
  84.  
  85.     maxh=0; px=2;
  86.     rsrc_gaddr(0,n->popup_form,&a);                /*find icon popup form*/
  87.     
  88.     for (s=a+1; s!=a; s=a+s->ob_next)
  89.     {
  90.         if (s->ob_height > maxh) maxh=s->ob_height;
  91.         s->ob_x=px;
  92.         s->ob_y=2;
  93.         s->ob_state&=~SELECTED;
  94.         px=px+s->ob_width+1;
  95.     }
  96.     
  97.     if (cr_clip.g_x+px>scrn_x+scrn_w)        /* Ensure that popup doesn't go off right of the screen */
  98.         a->ob_x=scrn_x+scrn_w-px-2;
  99.     else
  100.         a->ob_x=cr_clip.g_x-2;
  101.     a->ob_y=cr_clip.g_y-2;
  102.     a->ob_height=maxh+4;
  103.     a->ob_width=px+1;
  104.     (a+n->popup_icon_current)->ob_state|=SELECTED;
  105.     
  106.     vs_clip(x_handle,0,NULL);                            /*disable clipping for this one, otherwise background 
  107.                                                         isn't restored*/
  108.  
  109.     buf=(short*)malloc(((scrn_planes*(a->ob_width+6))/4)*(a->ob_height+10));
  110.  
  111.     if (buf)
  112.     {
  113.         scr.fd_addr=NULL;
  114.  
  115.         obm.fd_addr=buf;
  116.         obm.fd_w=a->ob_width+4;
  117.         obm.fd_h=a->ob_height+6;
  118.         obm.fd_wdwidth=(short)(obm.fd_w/8);
  119.         obm.fd_stand=1;
  120.         obm.fd_nplanes=scrn_planes;
  121.  
  122.         p[0]=a->ob_x; p[1]=a->ob_y-2;
  123.         p[2]=p[0]+a->ob_width; p[3]=p[1]+a->ob_height+4;
  124.         p[4]=p[5]=1;
  125.         p[6]=p[4]+a->ob_width; p[7]=p[5]+a->ob_height+4;
  126.  
  127.         graf_mouse(M_OFF,NULL);
  128.         vro_cpyfm(x_handle,S_ONLY,p,&scr,&obm);
  129.         objc_draw(a,0,2,scrn_x,scrn_y,scrn_w,scrn_h);
  130.         graf_mouse(M_ON,NULL);
  131.         
  132.         do {
  133.             graf_mkstate(&mx,&my,&mb,&junk);
  134.         } while (mb!=0);
  135.         
  136.         wind_update(BEG_UPDATE);
  137.         wind_update(BEG_MCTRL);
  138.         
  139.         rtn=0; c=n->popup_icon_current;
  140.         
  141. //        graf_mouse(USER_DEF,&SIDEARRW);
  142.         
  143.         while(!mb)
  144.         {
  145. #ifndef __USE_GNU
  146.             e=evnt_multi(MU_BUTTON|MU_M1, 1, 1, 1, 1, mx, my, 1, 1,0,0,0,0,0,
  147.                 messB,100,0,&mx,&my,&mb,&junk,&junk,&junk);
  148. #else
  149.             e=evnt_multi(MU_BUTTON|MU_M1, 1, 1, 1, 1,mx,my,1,1,0,0,0,0,0,
  150.                 messB,100,&mx,&my,&mb,&junk,&junk,&junk);
  151. #endif
  152.             if (!(e&MU_BUTTON)) graf_mkstate(&mx,&my,&mb,&junk);
  153.             
  154.             rtn=objc_find(a,0,1,mx,my);
  155.             if (rtn==0) rtn=c;
  156.             if (rtn<0) rtn=n->popup_icon_current;
  157.             
  158.             if (rtn!=c)
  159.             {
  160.                 if (c)
  161.                 {
  162.                     (a+c)->ob_state&=~SELECTED;
  163.                     (a+rtn)->ob_state|=SELECTED;
  164.                     graf_mouse(M_OFF,NULL);
  165.                     objc_draw(a,c,1,a->ob_x,a->ob_y,a->ob_width,a->ob_height);
  166.                     objc_draw(a,rtn,1,a->ob_x,a->ob_y,a->ob_width,a->ob_height);
  167.                     graf_mouse(M_ON,NULL);
  168.                 }
  169.                 
  170.                 c=rtn;
  171.             }
  172.         }
  173.  
  174. //        graf_mouse(ARROW,NULL);
  175.  
  176.         while (mb) graf_mkstate(&junk,&junk,&mb,&junk);
  177.         
  178.         wind_update(END_MCTRL);
  179.         wind_update(END_UPDATE);
  180.         
  181.         graf_mouse(M_OFF,NULL);
  182.         scr.fd_addr=NULL;
  183.         p[0]=p[1]=1;
  184.         p[2]=p[0]+a->ob_width; p[3]=p[1]+a->ob_height+4;
  185.         p[4]=a->ob_x; p[5]=a->ob_y-2;
  186.         p[6]=p[4]+a->ob_width; p[7]=p[5]+a->ob_height+4;
  187.         vro_cpyfm(x_handle,S_ONLY,p,&obm,&scr);
  188.         graf_mouse(M_ON,NULL);
  189.  
  190.         n->popup_icon_current=rtn;
  191.         a+=rtn;
  192.     
  193.         rsrc_gaddr(0,this_dialog,&s);                /*find form containing ipopup */
  194.         s+=this_ob;
  195.         a->ob_state=s->ob_state;
  196.  
  197.         free(buf);
  198.  
  199.         for(m=0; m<max_windows; m++)                    /*Send redraw messages to all our other windows*/
  200.         {
  201.             if ((windows[m].window_type!=wt_null)&&(windows[m].the_dialog==this_dialog))
  202.             {
  203.                 custom_display_object(m,this_ob);
  204.             }
  205.         }
  206.  
  207.         return TRUE;
  208.     } else {
  209.         form_alert(1,"[3][ | DULIB GUI ERROR: | Out of memory for icon popup | background buffering. ][ Cancel ]");
  210.         return FALSE;
  211.     }
  212. }
  213.